【Game Server Services(GS2)】GS2-Deployを使ってマスターデータなどのリソースをテンプレートで管理する

【Game Server Services(GS2)】GS2-Deployを使ってマスターデータなどのリソースをテンプレートで管理する

Clock Icon2024.08.19

こんにちは、ゲームソリューション部の入井です。

今回は、GS2でのリソース管理を効率化できる機能であるGS2-Deployについて紹介します。

GS2-Deployとは

GS2-Deployは、GS2のリソースをコードで管理できるIaC機能です。

GS2の各種サービスのリソース情報について(例えばGS2-Inventoryのアイテムマスターデータや、GS2-Exchangeのレート設定など)決められたフォーマットに従ったテンプレート(コード)で記述し、そのファイルをGS2-Deployにアップロードすることで自動的にコードの内容に基づいてGS2サーバーにリソースが作成・更新される仕組みになっています。

これらのリソース設定はマネジメントコンソール経由でGUIによる管理を行うこともできますが、取り扱うデータの量が増えてくると入力や情報管理の手間が大きな負担となります。

GS2-Deployを使用することで、リソースの作成・更新作業が自動化されるだけでなく、gitなどのバージョン管理システムで差分管理したり、複数の環境に同じ設定を簡単に適用したりすることができるようになります。

チュートリアルのテンプレートは何をしているのか

ここからはGS2-Deployの具体的な使い方を解説しています。

例として、GS2公式チュートリアルのGS2-Deployで必要なリソースを作成する手順を紹介しているステップからテンプレートコードを引用してみます。

GS2-Deployでは、以下のようなyamlファイルによってリソース情報を定義します。

GS2TemplateFormatVersion: "2019-05-01"
Description: GS2-Account initialize template Version 2010-06-26

Globals:
  Alias:
    AccountNamespaceName: game-0001
    KeyNamespaceAccountAuthentication: account-encryption-key-namespace
    KeyAccountAuthentication: account-encryption-key

Resources:
  KeyNamespaceAccountAuthentication:
    Type: GS2::Key::Namespace
    Properties:
      Name: ${KeyNamespaceAccountAuthentication}

  KeyAccountAuthentication:
    Type: GS2::Key::Key
    Properties:
      NamespaceName: ${KeyNamespaceAccountAuthentication}
      Name: ${KeyAccountAuthentication}
    DependsOn:
      - KeyNamespaceAccountAuthentication

  AccountNamespace:
    Type: GS2::Account::Namespace
    Properties:
      Name: ${AccountNamespaceName}

Outputs:
  AccountNamespaceName: !GetAttr AccountNamespace.Item.Name
  KeyAccountAuthenticationKeyId: !GetAttr KeyAccountAuthentication.Item.KeyId

チュートリアルの中ではこのテンプレートが具体的に何をしているのかの記述が少ないため、簡単に解説します。

このテンプレートではGS2-Accountの基本的な設定情報が主に書かれています。

先頭のGS2TemplateFormatVersionはこのテンプレートが何の形式で記載されているかを指定しています。現在は2019-05-01のみ指定可能となっており、将来的にGS2-Deployのアップデートで新しい形式が増えた場合、ここでそのバージョンを指定することで新しい形式が使用可能になるものと思われます。

Descriptionはこのテンプレートについての説明を書くことができる部分です。記載内容はGS2-Deployの動作内容に影響しません。

Globalsセクションでは、テンプレート内で使用する変数(Alias)を定義しています。
例えば、AccountNamespaceName: game-0001と定義していますが、これにより以降のテンプレートで${AccountNamespaceName}と記述した箇所で、実際にはgame-0001という値が入るようになります。
Aliasを活用することにより、テンプレート内で同じ値を繰り返し使用する際に一箇所で管理できるようになります。

Resourcesセクションでは、実際に作成するGS2のリソースを定義しています。ここでは、GS2-KeyとGS2-Accountのネームスペースとキーを作成しています。
GS2-Accoountのネームスペースを作成しているのは以下の部分です。

AccountNamespace:
    Type: GS2::Account::Namespace
    Properties:
      Name: ${AccountNamespaceName}

AccountNamespaceはリソースの定義名です。ここは任意の名前を設定することが可能です。
Type: GS2::Account::Namespaceは、設定対象のリソースを指定しています。ここではGS2-Accountのネームスペースを指定していますが、例えばType: GS2::Inventory::Namespaceと記述すると、GS2-Inventoryのネームスペースを指定していることになります
Propertiesでは対象リソースの各プロパティに何の値を設定するかを指定します。このテンプレートでは、 Name${AccountNamespaceName}エイリアス、つまりはgame-0001というテキストが入るように指定しています。
各サービスでTypeにどのようなリソースを指定できるかは、公式ドキュメントから確認できます。例えば、GS2-Accountについてはこのページで記載されています。

同じResourcesセクション内のKeyAccountAuthenticationDependsOnという項目がありますが、これはリソース同士の依存関係、つまりは先に作成されている必要があるリソースを指定しています。このテンプレートでは、KeyAccountAuthenticationKeyNamespaceAccountAuthenticationが作成された後作成するよう指定しています。

Outputsセクションでは、GS2-Deployの実行時に出力する値を指定します。このテンプレートでは、GS2-Accountに作成したネームスペース名などを出力するように指定しています。!GetAttrという記述がありますが、これによりリソースのプロパティの値が取得できる仕組みとなっています。
値は、GS2-Deployのマネジメントコンソール上で出力されます。

アイテム交換の仕組みをテンプレート化してみる

続いて、別のパターンのテンプレートをご紹介します。
以前作成した、GS2-Exchangeなどを活用してお金とアイテムを交換する仕組みについて、関連リソースをGS2-Deployで構築してみます。

https://dev.classmethod.jp/articles/gs2-buy-item-transaction/

リソースの具体的な内容は以下の通りです、

  • GS2-Inventory: プレイヤーのアイテム(ジュースとお金)を管理するインベントリ
  • GS2-Exchange: お金とジュースの交換レート

テンプレートの内容

実際に作成したYAMLファイルは以下の通りです。

GS2TemplateFormatVersion: "2019-05-01"

Globals:
  Alias:
    InventoryNamespaceName: JuiceAndYen
    ExchangeNamespaceName: ExchangeJuiceAndYen

Resources:

  InventoryNamespace:
    Type: GS2::Inventory::Namespace
    Properties:
      Name: ${InventoryNamespaceName}

  InventoryMasterData:
    Type: GS2::Inventory::CurrentItemModelMaster
    Properties:
      NamespaceName: ${InventoryNamespaceName}
      Settings:
        {
          "version": "2019-02-05",
          "inventoryModels": [
            {
              "name": "my-item",
              "initialCapacity": 10,
              "maxCapacity": 10,
              "protectReferencedItem": false,
              "itemModels": [
                {
                  "name": "juice",
                  "stackingLimit": 30,
                  "allowMultipleStacks": false,
                  "sortValue": 0
                },
                {
                  "name": "yen",
                  "stackingLimit": 10000,
                  "allowMultipleStacks": false,
                  "sortValue": 0
                }
              ]
            }
          ],
          "simpleInventoryModels": [],
          "bigInventoryModels": []
        }
    DependsOn:
      - InventoryNamespace

  ExchangeNamespace:
    Type: GS2::Exchange::Namespace
    Properties:
      Name: ${ExchangeNamespaceName}
      TransactionSetting:
        EnableAutoRun: true

  ExchangeMasterData:
    Type: GS2::Exchange::CurrentRateMaster
    Properties:
      NamespaceName: ${ExchangeNamespaceName}
      Settings:
        {
          "version": "2019-08-19",
          "rateModels": [
            {
              "name": "buy-juice",
              "consumeActions": [
                {
                  "action": "Gs2Inventory:ConsumeItemSetByUserId",
                  "request": "{\n  \"namespaceName\": \"game-001\",\n  \"inventoryName\": \"my-item\",\n  \"userId\": \"#{userId}\",\n  \"itemName\": \"yen\",\n  \"consumeCount\": 150\n}"
                }
              ],
              "timingType": "immediate",
              "lockTime": 0,
              "enableSkip": false,
              "skipConsumeActions": [],
              "acquireActions": [
                {
                  "action": "Gs2Inventory:AcquireItemSetByUserId",
                  "request": "{\n  \"namespaceName\": \"game-001\",\n  \"inventoryName\": \"my-item\",\n  \"itemName\": \"juice\",\n  \"userId\": \"#{userId}\",\n  \"acquireCount\": 1\n}"
                }
              ]
            }
          ],
          "incrementalRateModels": []
        }
    DependsOn:
      - ExchangeNamespace

Outputs:
  InventoryNamespaceName: !GetAttr InventoryNamespace.Item.Name
  ExchangeNamespaceName: !GetAttr ExchangeNamespace.Item.Name

Globalsでは、GS2-InventoriとGS2-Exchangeの今回使用する用のネームスペース名について、エイリアス定義しています。
Resourcesでは、各ネームスペース設定の他、GS2-Inventoryでジュースやお金を管理するインベントリのマスターデータ定義、GS2-Exchangeではジュースとお金を交換するレートマスターデータを定義しています。マスターデータの内容は、マネジメントコンソールでの設定時と同じようにJSON形式で行います。
Outputsでは、各ネームスペース名を出力しています。

テンプレートのアップロード

作成したテンプレートは、GS2のマネジメントコンソールからアップロードすることで実行できます。

具体的な手順としては、マネジメントコンソールにログインしてGS2-Deployのページを開き、スタック一覧画面から、「スタックの新規作成」ボタンをクリックします。

スタックの新規作成画面が開きますので、スタック名の入力とテンプレートファイルを選択後「作成」ボタンをクリックします。

スクリーンショット 2024-08-12 16.41.25

実行完了後の状態

リソース作成の進捗状況は、同じくマネジメントコンソールのGS2-Deployのスタック一覧ページから確認ができます。

実行状態が作成完了となっていれば、そのテンプレートの実行は完了しています。

スクリーンショット 2024-08-12 18.27.48

スタックの詳細画面に入ると、アップロードしたテンプレートの内容の他、イベントリスト・リソースリスト・アウトプットリストからリソース作成に関わる情報を見ることができます。

イベントリストでは、各リソースの作成がいつ始まりいつどのような結果になったのかというログを見ることができます。

スクリーンショット 2024-08-12 18.28.14

リソースリストでは、テンプレートファイル内で定義したリソース名とその実体の対応状況を一覧で見ることができます。

スクリーンショット 2024-08-12 18.28.26

アウトプットリストでは、テンプレートファイルのOutputsで指定した内容の出力結果が確認できます。

スクリーンショット 2024-08-12 18.28.38

また、GS2-Exchangeなどのページを開くと、テンプレート文で記載したとおりのリソースが作成されていることが確認できます。

スクリーンショット 2024-08-12 18.33.31

まとめ

GS2-Deployの概要と具体的な使用方法について解説しました。

リソース作成をコードで管理したり自動化することは、一定以上のプロジェクトを安全かつ効率的に管理するためにはほぼ必須になるため、まだ試していない人はこの記事で紹介したテンプレートをアレンジしたりしながら具体的な使い方を習得していただければと思います。

CEDEC2024のハンズオンで実際にGS2-Deployを体験してみよう

2024年8月23日のCEDEC2024にて、GS2のワークショップが開催されます。

この記事で紹介したGS2-Deployについてもハンズオン形式で体験できるため、興味のある方は是非ご参加ください。

https://dev.classmethod.jp/articles/cedec2024-gs2-1/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.